[Data Structure] Heap
Posted on
Heap
π λ³Έ ν¬μ€νΈλ μλ£κ΅¬μ‘°μ κ°λ μ μΆκ°μ μΌλ‘, μ§μ μ μΈ C++ ꡬνμ ν΅ν λͺ νν μλ£κ΅¬μ‘° μ΄ν΄λ₯Ό μν΄ μμ±λμμ΅λλ€. π
μ°μ μμ νλ₯Ό μ΄ν΄νκΈ° μν΄μ Heap μλ£κ΅¬μ‘°λ₯Ό λͺ ννκ² μ΄ν΄νμ¬μΌλ§ νλ€.
μ°λ¦¬λ λ§μ μκ³ λ¦¬μ¦ λ¬Έμ μμ μ°μ μμ νλ₯Ό μ¬μ©ν΄λ³Έ μ μ΄ μλ€. BFS μκ³ λ¦¬μ¦ λΏ λ§ μλλΌ λ€μν μ°μ μμ, μ€μΌμ₯΄λ§ μκ³ λ¦¬μ¦μλ μ°μ μμ νλ λΉ μ§μ§ μκ³ μ¬μ©λλ€.
μ°μ μμ νμ κ²½μ° λμ¨ν μ λ ¬ ννμ Heap μλ£κ΅¬μ‘°λ₯Ό ν΅ν΄ ν¨κ³Όμ μΌλ‘ νΉμ κΈ°μ€μ μν μ λ ¬κ°λ€μ μ°¨λ‘λ‘ μΆμΆν΄λΌ μ μλ€.
Complete Binary Tree
Heapμ μμ μ΄μ§ νΈλ¦¬ ννλ₯Ό κ°μ§κ³ μλ€.
Complete Binary Tree(μμ μ΄μ§ νΈλ¦¬) : λ§μ§λ§ λ 벨μ μ μΈν λͺ¨λ λ 벨μ λͺ¨λ λ Έλκ° μ±μμ Έ μκ³ , λ§μ§λ§ λ 벨μ λ Έλλ€μ μΌμͺ½λΆν° μ°¨λ‘λ‘ μ±μμ Έ μλ νΈλ¦¬ νν
Full Binary Tree(ν¬ν μ΄μ§ νΈλ¦¬) : μμ λ Έλλ₯Ό μμ κ°μ§μ§ μκ±°λ, 무쑰건 2κ°λ₯Ό κ°μ§λ μ΄μ§ νΈλ¦¬ νν
Min Heap : λΆλͺ¨ ν€ κ°μ΄ μμ λ Έλ ν€ κ°λ³΄λ€ μμ μμ μ΄μ§ νΈλ¦¬, λ£¨νΈ λ Έλκ° νΈλ¦¬ μμμ κ°μ₯ μμ κ°μ΄λ€.
Max Heap : λΆλͺ¨ ν€ κ°μ΄ μμ λ Έλ ν€ κ° λ³΄λ€ ν° μμ μ΄μ§ νΈλ¦¬, λ£¨νΈ λ Έλκ° νΈλ¦¬ μμμ κ°μ₯ ν° κ°μ΄λ€.
Heap μ½μ , μμ μ°μ°
μ½μ
- μμ μ΄μ§ νΈλ¦¬μ λ€μμΌλ‘ λΉμμ Έ μλ λ Έλμ κ°μ μ½μ .
- μ½μ ν λ Έλμ λΆλͺ¨ λ Έλμ κ°μ λΉκ΅ν΄ 쑰건μ λ§μ§ μμ κ²½μ° swap ν΄μ€
- λ£¨νΈ λ Έλμ λλ¬νκ±°λ, λ μ΄μ 쑰건μ λ§μ§ μλ λ Έλκ° μμ λ κΉμ§ 1, 2λ² κ³Όμ λ°λ³΅
μμ -> μμ μ μμ Heapμ λ£¨νΈ λ Έλμ μμλ§μ μμ ν μ μμ(pop)
- λ£¨νΈ λ Έλ μμ μμ
- λ§μ§λ§μ μμΉν λ Έλλ₯Ό λ£¨νΈ λ Έλ μμΉλ‘ λμ΄μ¬λ¦Ό
- μ΄λμν¨ λ£¨νΈ λ Έλμ μμλ Έλμ κ°μ λΉκ΅ν΄κ°λ©° 쑰건μ λ§μ§ μμ κ²½μ° swap ν΄μ€
- μ΅νλ¨ λ 벨μ λ ΈλκΉμ§ λλ¬νκ±°λ λ μ΄μ 쑰건μ λ§μ§ μλ λ Έλκ° μμ λκΉμ§ swap κ³Όμ λ°λ³΅
ꡬν μ½λ
-> STL Libraryμ min heap μ°μ μμ νμ μ μ¬νκ² κ΅¬ννλ € μλν μ½λμ΄λ€.
#include <iostream>
#define SIZE 10000
using namespace std;
class MinHeap {
public :
int *heap = new int[SIZE];
int heapcount = 1;
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int size() {
return heapcount - 1;
}
bool isEmpty() {
return heapcount == 1;
}
int top() {
return heap[1];
}
void push(int num) {
int curidx = heapcount;
heap[heapcount++] = num;
while (curidx > 1 && heap[curidx] < heap[curidx / 2]) {
swap(&heap[curidx], &heap[curidx / 2]);
curidx /= 2;
}
}
void pop() {
heap[1] = heap[--heapcount];
int parent = 1, child = 2;
if (child + 1 <= heapcount)
child = (heap[child] > heap[child + 1]) ? child + 1 : child;
while (child <= heapcount && heap[child] < heap[parent]) {
swap(&heap[child], &heap[parent]);
parent = child;
child *= 2;
if (child + 1 <= heapcount)
child = (heap[child] > heap[child + 1]) ? child + 1 : child;
}
}
};
int main() {
int tc, n, input;
MinHeap minheap;
cin >> tc;
while (tc--) {
cin >> n;
while (n--) {
cin >> input;
minheap.push(input);
}
while (!minheap.isEmpty()) {
cout << minheap.top() << ' ';
minheap.pop();
}
cout << '\n';
}
return 0;
}